// bind() 方法创建一个新的函数，在 bind() 被调用时，
// 这个新函数的 this 被指定为 bind() 的第一个参数，而其余参数将作为新函数的参数，供调用时使用。

// apply()函数用于调用当前函数functionObject，并可同时使用指定对象thisObj作为本次函数执行时函数内部的this指针引用。
function fn(a, b, c, d) {
  console.log('fn call')
  console.log('args:', a, b, c, d)
  console.log('this:', this)
  return 123
}

Function.prototype.myBind = function (ctx, ...args) {
  const fn = this
  return function (...subArgs) {
    const allArgs = [...args, ...subArgs]
    if (new.target) {
      return new fn(...allArgs)
    } else {
      return fn.apply(ctx, allArgs)
    }
  }
}

const newFn = fn.myBind('ctx', 1, 2)
newFn(3, 4)
